package com.zyf.project.binaryproto.contract;

import com.zyf.project.binaryproto.specification.DataSpecification;
import utils.binary.impl.BytesSlice;
import utils.binary.BytesSlices;

import java.util.List;

/**
 * <h1>数据契约代理对象</h1>
 * <p>表示基于字节数组进行反序列化而创建的动态代理数据对象的实例</p>
 * @author Zhou Yifan
 */
public interface DataContractProxy {

    /**
     * 数据契约的格式标准
     *
     * @return {@link DataSpecification}
     */
    DataSpecification getSpecification();

    /**
     * 数据契约的接口类型
     *
     * @return Class
     */
    Class<?> getContractType();

    /**
     * 总的字节大小
     *
     * @return int 值
     */
    public int getTotalSize();

    /**
     * 总的数据片段
     *
     * @return {@link BytesSlice}
     */
    public BytesSlice getTotalSlice();

    /**
     * 所有的字节数据片段
     *
     * @return {@link BytesSlices} 的 {@link List}
     */
    public List<BytesSlices> getDataSlices();

    /**
     * 把对象序列化的原始字节数据写入指定的字节缓冲区
     *
     * @param buffer 要写入的缓冲区
     * @param offset 缓冲区写入的起始位置
     * @return 实际写入的字节数
     */
    public int writeBytes(byte[] buffer, int offset);

}
